﻿using Npgsql;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;

namespace VoteInformationSystem.Models
{
    public class NpgsqlBundestagswahlRepository : IBundestagswahlRepository
    {
        public Bundestagswahl Get(int Id)
        {
            Bundestagswahl btwahl = null;

            using (NpgsqlConnection pgConnection = NpgsqlConnectionProvider.GetConnection())
            using (NpgsqlCommand command = new NpgsqlCommand("select \"idbundestagswahl\", \"jahr\" from \"Bundestagswahlen\" where \"idbundestagswahl\" = :id", pgConnection))
            {
                command.Parameters.Add(new NpgsqlParameter("id", NpgsqlTypes.NpgsqlDbType.Integer));
                command.Prepare();
                command.Parameters.First<NpgsqlParameter>().Value = Id;
                using (NpgsqlDataReader dataReader = command.ExecuteReader())
                {
                    if (dataReader.Read())
                    {
                        btwahl = new Bundestagswahl() { Id = dataReader.GetInt32(0), Jahr = dataReader.GetInt32(1) };
                    }
                }
            }

            return btwahl;
        }

        public IEnumerable<Bundestagswahl> GetAll()
        {
            IList<Bundestagswahl> btwahlEnumerable = new List<Bundestagswahl>();

            using (NpgsqlConnection pgConnection = NpgsqlConnectionProvider.GetConnection())
            using (NpgsqlCommand command = new NpgsqlCommand("select \"idbundestagswahl\", \"jahr\" from \"Bundestagswahlen\"", pgConnection))
            using (NpgsqlDataReader dataReader = command.ExecuteReader())
            {
                while (dataReader.Read())
                {
                    btwahlEnumerable.Add(new Bundestagswahl() { Id = dataReader.GetInt32(0), Jahr = dataReader.GetInt32(1) });
                }
            }

            return btwahlEnumerable;
        }

        public Bundestagswahl GetPrevious(int Id)
        {
            Bundestagswahl btwahl = null;

            using (NpgsqlConnection pgConnection = NpgsqlConnectionProvider.GetConnection())
            using (NpgsqlCommand command = new NpgsqlCommand("with Current (idbundestagswahl, jahr) as " + 
                                                             "(select \"idbundestagswahl\", \"jahr\" " +
                                                             "from \"Bundestagswahlen\" " + 
                                                             "where \"idbundestagswahl\" = :id)" +
                                                             "select idbundestagswahl, jahr as jahr1 from \"Bundestagswahlen\"" +
                                                             "where jahr < (select jahr from Current) and jahr >= ALL " +
                                                             "(select jahr from \"Bundestagswahlen\"" +
                                                             "where jahr < (select jahr from Current))", pgConnection))
            {
                command.Parameters.Add(new NpgsqlParameter("id", NpgsqlTypes.NpgsqlDbType.Integer));
                command.Prepare();
                command.Parameters.First<NpgsqlParameter>().Value = Id;
                using (NpgsqlDataReader dataReader = command.ExecuteReader())
                {
                    if (dataReader.Read())
                    {
                        btwahl = new Bundestagswahl() { Id = dataReader.GetInt32(0), Jahr = dataReader.GetInt32(1) };
                    }
                    else
                    {
                        btwahl = new Bundestagswahl() {Id = 0, Jahr = 0};
                    }
                }
            }

            return btwahl;
        }
    }
}